 
/* 
 * Copyright (C) Ignacio Lucas
 */
 
/*
 *  timer_service, hecho Ignacio Lucas
 *
 *  Encapsulamiento de mecanismo para administrar timers sobre objetos.
 *  
 *  Ignacio Lucas <ignacio.lucas@gmail.com>
 */
#if !defined(TIMER_SERVICE_H)
#define TIMER_SERVICE_H

#include "job_event.h"

/* estructura asociada al mecanismo de timers */
typedef struct s_timer_service *timer_service_t;

/* opaque para referenciar la estructura que registra un timer para un evento. */

// funcion que llamara timer_service cada vez que detecte un timeout.
typedef int (*timeout_event_callback)(job_event_t event, void *caller);

/* 
	La inicializacion del servicio recibe como parametro el fd donde se debe escribir un byte cada
	vez que exista alguna actualizacion de timers.	
*/
timer_service_t timer_service_init(int fd_notif, void *caller, timeout_event_callback callback_func);

// tamanio de la estructura asociada a los elementos de timers.
size_t timer_service_get_timer_size();

// registra un nuevo timer al servicio, usando la info contenida en event->timeout_config
inline int timer_service_register_timeout(timer_service_t ts, job_event_t event);

// quita la configuracion de timeout que para el evento event
inline int timer_service_remove_timeout(timer_service_t ts, job_event_t event);

// funcion que dispara el procesamiento de todos los timeouts vencidos.
inline void timer_service_process_timeouts(timer_service_t ts, int *next_event_delta_time, int default_delta_time_no_pending_timers);

/* destruccion del mecanismo de timers. */
int timer_service_destroy(timer_service_t t);

#endif
